/**
         * Created by Wandergis on 2015/7/8.
         * 提供了百度坐标（BD09）、国测局坐标（火星坐标，GCJ02）、和WGS84坐标系之间的转换
         */
        //定义一些常量
        var x_PI = 3.14159265358979324 * 3000.0 / 180.0;
        var PI = 3.1415926535897932384626;
        var a = 6378245.0;
        var ee = 0.00669342162296594323;

        /**
         * 百度转高德
         * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换
         * 即 百度 转 谷歌、高德
         * @param bd_lon
         * @param bd_lat
         * @returns {*[]}
         */
        function BD092GCJ02(bd_lon, bd_lat) {
            var x_pi = 3.14159265358979324 * 3000.0 / 180.0;
            var x = bd_lon - 0.0065;
            var y = bd_lat - 0.006;
            var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_pi);
            var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_pi);
            var gg_lng = z * Math.cos(theta);
            var gg_lat = z * Math.sin(theta);
            return [gg_lng, gg_lat]
        }

        /**
         * 高德转百度
         * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
         * 即谷歌、高德 转 百度
         * @param lng
         * @param lat
         * @returns {*[]}
         */
        function GCJ022BD09(lng, lat) {
            var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI);
            var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI);
            var bd_lng = z * Math.cos(theta) + 0.0065;
            var bd_lat = z * Math.sin(theta) + 0.006;
            return [bd_lng, bd_lat]
        }

        /**
         * WGS84转GCj02 天地转高德
         * @param lng
         * @param lat
         * @returns {*[]}
         */
        function WGS842GCJ02(lng, lat) {
            if (out_of_china(lng, lat)) {
                return [lng, lat]
            }
            else {
                var dlat = transformlat(lng - 105.0, lat - 35.0);
                var dlng = transformlng(lng - 105.0, lat - 35.0);
                var radlat = lat / 180.0 * PI;
                var magic = Math.sin(radlat);
                magic = 1 - ee * magic * magic;
                var sqrtmagic = Math.sqrt(magic);
                dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
                dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
                var mglat = lat + dlat;
                var mglng = lng + dlng;
                return [mglng, mglat]
            }
        }

        /**
         * GCJ02 转换为 WGS84 高德转天地
         * @param lng
         * @param lat
         * @returns {*[]}
         */
        function GCJ022WGS84(lng, lat) {
            if (out_of_china(lng, lat)) {
                return [lng, lat]
            }
            else {
                var dlat = transformlat(lng - 105.0, lat - 35.0);
                var dlng = transformlng(lng - 105.0, lat - 35.0);
                var radlat = lat / 180.0 * PI;
                var magic = Math.sin(radlat);
                magic = 1 - ee * magic * magic;
                var sqrtmagic = Math.sqrt(magic);
                dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
                dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
                mglat = lat + dlat;
                mglng = lng + dlng;
                return [lng * 2 - mglng, lat * 2 - mglat]
            }
        }
        //百度转天地
        function BD092WGS84(lng, lat) {
            var p = BD092GCJ02(lng, lat);
            var c = GCJ022WGS84(p[0], p[1]);
            return c;
        }

        //天地转百度
        function WGS842BD09(lng, lat) {
            var p = WGS842GCJ02(lng, lat);
            return GCJ022BD09(p[0], p[1]);
        }

        function transformlat(lng, lat) {
            var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
            ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
            ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
            ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
            return ret
        }

        function transformlng(lng, lat) {
            var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
            ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
            ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
            ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
            return ret
        }

        /**
         * 判断是否在国内，不在国内则不做偏移
         * @param lng
         * @param lat
         * @returns {boolean}
         */
        function out_of_china(lng, lat) {
            return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false);
        }

        /**
         * 度分秒转度
         */
        function ChangeToDu(dfm) {
            var r = dfm.match(/(\d+(\.\d+)?)°(\d+(\.\d+)?)′(\d+(\.\d+)?)″/);
            var d = RegExp.$1;
            var f = RegExp.$3;
            var m = RegExp.$5;
            if (r) {
                var f = parseFloat(f) + parseFloat(m / 60);
                var du = parseFloat(f / 60) + parseFloat(d);
                return du;
            }
            return dfm;
        }

        window.onload = function () {
            //度模式
            // var reg = /([^\d°′″]|^)+([0-9]{1,3}\.[0-9]+)/g;
            //度分秒模式
            // var regDFM = /([^\d]|^)+((\d+(\.\d+)?)°(\d+(\.\d+)?)′(\d+(\.\d+)?)″)/g;
            var regAll = /(([^\d°′″]|^)+([0-9]{1,3}\.[0-9]+))|(([^\d]|^)+((\d+(\.\d+)?)°(\d+(\.\d+)?)′(\d+(\.\d+)?)″))/g;
            var calMethod = "BD092WGS84";

            var convertBtn = document.getElementById("convert");
            var formatBtn = document.getElementById("format");
            var resultArea = document.getElementById("result_gps");
            var inputArea = document.getElementById("input_gps");
            var infoArea = document.getElementById("info");

            //转换
            convertBtn.onclick = function () {
                //初始化
                resultArea.value = "";
                groupCalculate();
                var array = dowork();
				if(array) {
					resultArea.value = array.join("\n");
					activeGo();
				}
            };

            //格式化
            formatBtn.onclick = function () {
                calMethod = "self";
                var array = dowork();
				if(array) {
					inputArea.value = array.join("\n");
					activeGo();
				}
            }

            //执行
            function dowork() {
                var input = inputArea.value;
                //中国的经纬度范围大约为：纬度3.5~53.55，经度73.66~135.05
                //换行分
                //var a = input.split(/\n/);
                //1.去除空格
                //1. lat:xxx lng:xxx 或者 经度：xxx纬度xxx
                var result = input.match(regAll);

                if (!result) {
                    alert("数据格式不正确");
                    return;
                }

                if (result.length % 2 != 0) {
                    alert("经纬度坐标对不匹配");
                    return;
                }

                var r_length = result.length >> 1;
                infoArea.innerText = "共计" + r_length + "组坐标";

                //最终结果
                var convertArray = new Array();
                var tmp_point = new Array(2);

                //遍历
                for (var i = 0; i < result.length; i++) {
                    var v = result[i].trim();
                    var nowPoint = fetchPoint(v);

                    tmp_point[nowPoint[0]] = nowPoint[1];

                    if (i % 2 != 0) {
                        var targetPoint = excCalculate(tmp_point[0], tmp_point[1]);
                        convertArray.push(targetPoint);
                        tmp_point = new Array(2);
                    }
                }

                return convertArray;
            }

            //0代表经度  1代表纬度latitude
            function fetchPoint(point) {
                var r = point.match(/([^\d]+|^)+((\d+(\.\d+)?)°(\d+(\.\d+)?)′(\d+(\.\d+)?)″)/);
                if (!r) {
                    r = point.match(/([^\d°′″]+|^)([0-9]{1,3}\.[0-9]+)/);
                }

                var a = RegExp.$1;
                var b = ChangeToDu(RegExp.$2);
                if (a.search(/经|(lng)|(lo)/) != -1) return [0, b];
                if (a.search(/纬|(lat)/) != -1) return [1, b];

                //中国经度
                if (b >= 73.66 && b <= 135.05) return [0, b];
                //中国纬度
                if (b >= 3.5 && b <= 53.55) return [1, b];
            }

            //获取当前选择
            function groupCalculate() {
                var ogn = getSelectedValue("ognSelect");
                var target = getSelectedValue("targetSelect");
                if (ogn == target) {
                    //自己转自己，可实现度分秒转度或者格式化
                    calMethod = "self";
                } else {
                    calMethod = ogn + "2" + target;
                }
            }

            //动态执行函数
            function excCalculate(lng, lat) {
                if (calMethod == "self") {
                    return [lng, lat];
                }
                if (typeof (eval(calMethod)) == "function") {
                    return eval(calMethod + "(" + lng + ", " + lat + ");");
                } else {
                    alert("无此计算");
                }
            }

            //获取下拉选中值
            function getSelectedValue(id) {
                var ognS = document.getElementById(id);
                var index = ognS.selectedIndex; // 选中索引
                return ognS.options[index].value; // 选中文本
            }

            //监听输入框
            function activeGo() {
                var scrollI = inputArea.scrollHeight;
                var hI = inputArea.offsetHeight;

                var scrollHR = resultArea.scrollHeight;
                var hR = resultArea.offsetHeight;

                var scrollHeight = scrollI > scrollHR ? scrollI : scrollHR;
                var height = hI > hR ? hI : hR;

                if (height < scrollHeight) {
                    inputArea.style.height = scrollHeight + 'px';
                    resultArea.style.height = inputArea.style.height;
                }
            }
            inputArea.addEventListener('propertychange', activeGo);
            inputArea.addEventListener('input', activeGo);
        }